/*
 * Copyright 2013 University of Padua, Italy
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */


package it.unipd.dei.bd.icineasti.servlet.admin;

import it.unipd.dei.bd.icineasti.servlet.AbstractDatabaseServlet;

import it.unipd.dei.bd.icineasti.database.GetPalinsestiDatabase;
import it.unipd.dei.bd.icineasti.database.CreaOAggiornaPalinsestoDatabase;
import it.unipd.dei.bd.icineasti.resource.Palinsesto;


import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Date;
import java.sql.Timestamp;
import java.util.List;
import java.util.Calendar;
import java.math.BigDecimal;

import java.text.SimpleDateFormat;

import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.sql.DataSource;

import java.util.HashMap;
import java.util.Iterator;
import java.text.SimpleDateFormat;

import org.apache.commons.lang3.StringEscapeUtils; 

/**
 * Servlet per la gestione delle voci di palinsesto
 * 
 * @author Mattia Coccato
 *
 */
public class GestionePalinsestoServlet extends AbstractDatabaseServlet {

	public void doGet(HttpServletRequest req, HttpServletResponse res)
			throws ServletException, IOException {

		// imposta il tipo MIME della risposta
		res.setContentType("application/json;charset=utf-8");

		// ottiene un flusso di uscita per scrivere la risposta
		PrintWriter out = res.getWriter();

		Connection con = null;

		if (req.getParameter("codiceEvento") == null) return;

		try {
			con = DS.getConnection();
			Palinsesto palinsesto = null;
			int codiceEvento = Integer.parseInt(req.getParameter("codiceEvento"));
			int codicePalinsesto = Integer.parseInt(req.getParameter("codicePalinsesto"));

			palinsesto = new GetPalinsestiDatabase(con, codiceEvento).getSingoloDaCodice(codicePalinsesto);
			
			//stampo array in formato json
			out.printf("{");
			out.printf("\"codicePalinsesto\": \"%s\", ", palinsesto.getCodice());
			out.printf("\"data\": \"%s\", ", new SimpleDateFormat("yyyy-MM-dd").format(palinsesto.getDataOra()));
			out.printf("\"ore\": \"%s\", ", new SimpleDateFormat("HH").format(palinsesto.getDataOra()));
			out.printf("\"minuti\": \"%s\", ", new SimpleDateFormat("mm").format(palinsesto.getDataOra()));
			out.printf("\"in3d\": \"%s\" ", String.valueOf(palinsesto.getIsIn3d()));

			out.printf("}");

		} catch (NullPointerException e) {
			// messaggio d'errore
			out.printf("<p class=\"errore\">Impossibile creare la connessione al database.</p>");
		} catch (SQLException e) {
			// messaggio d'errore
			out.printf("<p class=\"errore\">Errore durante l'accesso al database: %s</p>",
			e.getMessage());
		} catch (Exception e) {
			// messaggio d'errore
			out.printf("<p class=\"errore\">Errore durante l'accesso al database: %s</p>",
			e.getMessage());
		}

		// assicura che tutto il contenuto sia inviato
		out.flush();

		// chiude il flusso di uscita
		// out.close();

	}


	public void doPost(HttpServletRequest req, HttpServletResponse res)
			throws ServletException, IOException {

		res.setContentType("text/html");

		PrintWriter out = res.getWriter();

		String idAsString = null; 

		Connection conn;
		
		try {
			conn = DS.getConnection();

			int codiceEvento = Integer.parseInt(req.getParameter("codiceEvento"));
			int codicePalinsesto = (req.getParameter("isNuovo").toLowerCase().equals("true"))? 
						-1 : //non è usato, è per evitare eccezioni
						Integer.parseInt(req.getParameter("codicePalinsesto"));
			SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");

			Calendar calendario = Calendar.getInstance();
			calendario.setTimeInMillis(formatter.parse(req.getParameter("data")).getTime());
			calendario.add(Calendar.HOUR_OF_DAY, Integer.parseInt(req.getParameter("ore")));
			calendario.add(Calendar.MINUTE, Integer.parseInt(req.getParameter("minuti")));


			Timestamp data = new Timestamp(calendario.getTimeInMillis());			

			Palinsesto palinsesto = new Palinsesto(codicePalinsesto, data, codiceEvento, 
						req.getParameter("in3d").toLowerCase().equals("true"));

			CreaOAggiornaPalinsestoDatabase operatore = new CreaOAggiornaPalinsestoDatabase(conn, palinsesto);
			
			if (req.getParameter("isNuovo").toLowerCase().equals("true")) {
				operatore.inserisciPalinsesto();
				out.printf("<p class=\"ok\">Inserito correttamente!</p>");
			} else {
				operatore.aggiornaPalinsesto();
				out.printf("<p class=\"ok\">Salvato correttamente!</p>");
			}
			
		} catch (Exception e) {
			out.printf("<p class\"errore\">Errore generale: %s</p>", e.getMessage());
			return;
		}
	}

}
